﻿package mortal.game.view.common.tooltip
{
    import Message.DB.Tables.*;
    import Message.Game.*;
    import Message.Public.*;
    import com.mui.controls.*;
    import com.mui.manager.*;
    import flash.utils.*;
    import mortal.game.cache.*;
    import mortal.game.cache.packCache.*;
    import mortal.game.model.*;
    import mortal.game.resource.*;
    import mortal.game.resource.info.item.*;
    import mortal.game.utils.*;
    import mortal.game.view.common.tooltip.tooltips.*;
    import mortal.game.view.common.tooltip.tooltips.base.*;
    import mortal.game.view.common.tooltip.tooltips.data.*;
    import mortal.game.view.firstReCharge.*;
    import mortal.game.view.lotteryDraw.*;
    import mortal.game.view.mainUI.roleAvatar.*;
    import mortal.game.view.medal.*;
    import mortal.game.view.pack.data.*;
    import mortal.game.view.palyer.data.*;
    import mortal.game.view.palyer.util.*;
    import mortal.game.view.skill.*;
    import mortal.game.view.vip.*;

    public class TooltipFactory extends Object
    {
        private var _cacheLeft:Dictionary;
        private var _cacheRight:Dictionary;
        private var _tipsMap:Dictionary;

        public function TooltipFactory()
        {
            this._cacheLeft = new Dictionary();
            this._cacheRight = new Dictionary();
            this._tipsMap = new Dictionary();
            TooltipType.registerCompareToolTipType(TooltipType.TestCompareTips);
            TooltipType.registerCompareToolTipType(TooltipType.Equipment);
            TooltipType.registerCompareToolTipType(TooltipType.FashionEquip);
            TooltipType.registerCompareToolTipType(TooltipType.SpriteEquipment);
            TooltipType.registerCompareToolTipType(TooltipType.MountEquip);
            TooltipType.registerCompareToolTipType(TooltipType.HalidomEquip);
            TooltipType.registerCompareToolTipType(TooltipType.Rune);
            TooltipType.registerCompareToolTipType(TooltipType.XiLianYuLan);
            this.registerToolTipRender(TooltipType.Item, ToolTipBaseItem);
            this.registerToolTipRender(TooltipType.Text, ToolTipLabel);
            this.registerToolTipRender(TooltipType.Buff, ToolTipBuff);
            this.registerToolTipRender(TooltipType.Skill, ToolTipSkill);
            this.registerToolTipRender(TooltipType.SkillShowNext, ToolTipSkillShowNext);
            this.registerToolTipRender(TooltipType.SkillGuild, ToolTipGuildSkill);
            this.registerToolTipRender(TooltipType.Equipment, ToolTipEquipment);
            this.registerToolTipRender(TooltipType.SpriteEquipment, ToolTipWizardEquipment);
            this.registerToolTipRender(TooltipType.Rune, ToolTipRune);
            this.registerToolTipRender(TooltipType.PetEgg, ToolTipPetEgg);
            this.registerToolTipRender(TooltipType.MountEquip, ToolTipMountEquip);
            this.registerToolTipRender(TooltipType.PetTotemEquip, ToolTipPetTotemEquip);
            this.registerToolTipRender(TooltipType.DefenseEquip, ToolTipDefenseEquip);
            this.registerToolTipRender(TooltipType.DefenseComposeItem, ToolTipDefenseComposeItem);
            this.registerToolTipRender(TooltipType.JewelStone, ToolTipJewelStone);
            this.registerToolTipRender(TooltipType.Bless, TooltipBless);
            this.registerToolTipRender(TooltipType.FashionEquip, ToolTipFashionEquip);
            this.registerToolTipRender(TooltipType.GrowthTalentItem, ToolTipGrowthTalentItem);
            this.registerToolTipRender(TooltipType.Title, ToolTipTitle);
            this.registerToolTipRender(TooltipType.WorldSmallBoss, ToolTipWorldSmallBoss);
            this.registerToolTipRender(TooltipType.PackLockGrid, TooltipPackGrid);
            this.registerToolTipRender(TooltipType.ChallengeCopy, ToolTipChallengeCopy);
            this.registerToolTipRender(TooltipType.MedalTotal, ToolTipMedalTotal);
            this.registerToolTipRender(TooltipType.Medal, TooltipMedal);
            this.registerToolTipRender(TooltipType.HalidomEquip, ToolTipHalidomEquip);
            this.registerToolTipRender(TooltipType.FuncPre_Picture, ToolTipFuncPre_Picture);
            this.registerToolTipRender(TooltipType.FuncPre_3D, ToolTipFuncPre_3D);
            this.registerToolTipRender(TooltipType.LotteryDrawRareItem, ToolTipLotteryDrawRareItem);
            this.registerToolTipRender(TooltipType.VipIcon, TooltipVip);
            this.registerToolTipRender(TooltipType.Wing288, TooltipWing288);
            this.registerToolTipRender(TooltipType.XiLianYuLan, ToolTipEquipmentXiLianYuLan);
            this.registerToolTipRender(TooltipType.FirstRecharge, TooltipFirstRecharge);
            this.registerToolTipRender(TooltipType.LotteryDraw, ToolTipLotteryDraw);
            return;
        }// end function

        public function registerToolTipRender(param1:String, param2:Class) : void
        {
            this._tipsMap[param1] = param2;
            return;
        }// end function

        public function unRegisterToolTipRender(param1:String) : void
        {
            delete this._tipsMap[param1];
            return;
        }// end function

        public function createToolTip(param1) : Array
        {
            var _loc_8:* = undefined;
            var _loc_9:SBuyBackItem = null;
            var _loc_10:TSystemTrailer = null;
            var _loc_11:IToolTip = null;
            var _loc_12:Object = null;
            var _loc_2:* = TooltipType.Text;
            var _loc_3:* = param1;
            var _loc_4:int = -1;
            if (param1 is String)
            {
                _loc_2 = TooltipType.Text;
            }
            else
            {
                if (param1 is Function)
                {
                    _loc_8 = (param1 as Function).apply();
                    return this.createToolTip(_loc_8);
                }
                if (param1 is ItemData)
                {
                    _loc_2 = this.getItemToolTipType(param1 as ItemData);
                }
                else if (param1 is SBuyBackItem)
                {
                    _loc_9 = param1 as SBuyBackItem;
                    _loc_3 = new ItemData(_loc_9.itemCode);
                    _loc_4 = _loc_9.amount * _loc_3.itemInfo.sellPrice;
                    _loc_2 = this.getItemToolTipType(_loc_3 as ItemData);
                }
                else if (param1 is TRune)
                {
                    _loc_2 = TooltipType.Rune;
                }
                else if (param1 is ToolTipInfo)
                {
                    _loc_2 = (param1 as ToolTipInfo).type;
                    _loc_3 = (param1 as ToolTipInfo).tooltipData;
                }
                else if (param1 is SkillInfo)
                {
                    _loc_2 = TooltipType.Skill;
                }
                else if (param1 is SkillInfo)
                {
                    _loc_2 = TooltipType.Skill;
                }
                else if (param1 is TWorldBoss)
                {
                    _loc_2 = TooltipType.WorldSmallBoss;
                }
                else if (param1 is PackObject)
                {
                    _loc_2 = TooltipType.PackLockGrid;
                }
                else if (param1 is TChallengeCopy)
                {
                    _loc_2 = TooltipType.ChallengeCopy;
                }
                else if (param1 is MedalData)
                {
                    _loc_2 = TooltipType.MedalTotal;
                }
                else if (param1 is TMedal)
                {
                    _loc_2 = TooltipType.Medal;
                }
                else if (param1 is TVip)
                {
                    _loc_2 = TooltipType.VipIcon;
                }
                else if (param1 is Wing288Data)
                {
                    _loc_2 = TooltipType.Wing288;
                }
                else if (param1 is FirstRechargeTipsData)
                {
                    _loc_2 = TooltipType.FirstRecharge;
                }
                else if (param1 is LotteryDrawTipsData)
                {
                    _loc_2 = TooltipType.LotteryDraw;
                }
                else if (param1 is BuffData)
                {
                    _loc_2 = TooltipType.Buff;
                }
                else if (param1 is TSystemTrailer)
                {
                    _loc_2 = this.getFuncPreToolTipType(param1 as TSystemTrailer);
                    if (_loc_2 == TooltipType.Text)
                    {
                        _loc_10 = param1 as TSystemTrailer;
                        if (_loc_10.hasOwnProperty("tips"))
                        {
                            _loc_3 = _loc_10["tips"];
                        }
                        else
                        {
                            _loc_3 = _loc_10.desc;
                        }
                    }
                }
                else if (param1 is ToolTipLotteryDrawRareItemData)
                {
                    _loc_2 = TooltipType.LotteryDrawRareItem;
                }
            }
            var _loc_5:* = TooltipType.isNeedCompareToolTipType(_loc_2);
            var _loc_6:Array = [];
            var _loc_7:* = this.getToolTipByType(_loc_2, this._cacheLeft);
            if (_loc_7 is IToolTipBaseItemComparable)
            {
                (_loc_7 as IToolTipBaseItemComparable).setEquipedData(null);
            }
            _loc_7.data = _loc_3;
            if (_loc_7 is IToolTipBaseItem)
            {
                (_loc_7 as IToolTipBaseItem).setBuyback(_loc_4);
            }
            _loc_6.push(_loc_7);
            if (_loc_5 && _loc_4 <= 0)
            {
                _loc_11 = this.getToolTipByType(_loc_2, this._cacheRight);
                _loc_12 = this.getSelfEquipItemData(_loc_3 as ItemData);
                if (_loc_12 != null)
                {
                    if (_loc_11 is IToolTipBaseItemComparable)
                    {
                        (_loc_11 as IToolTipBaseItemComparable).setEquipedData(null);
                        (_loc_7 as IToolTipBaseItemComparable).setEquipedData(_loc_12);
                        _loc_7.data = _loc_3;
                    }
                    _loc_11.data = _loc_12;
                    _loc_6.push(_loc_11);
                }
            }
            return _loc_6;
        }// end function

        private function getSelfEquipItemData(param1:ItemData) : ItemData
        {
            var _loc_2:ItemData = null;
            var _loc_3:int = 0;
            var _loc_4:FashionPackCache = null;
            var _loc_5:FashionAdvanceData = null;
            var _loc_6:int = 0;
            var _loc_7:PackPosTypeCache = null;
            if (param1 == null)
            {
                return null;
            }
            if (ItemsUtil.isRune(param1.itemInfo))
            {
                _loc_2 = Cache.instance.pack.runeBag.getItemDataByPoseType(param1.itemInfo.type);
            }
            else if (ItemsUtil.isEquip(param1))
            {
                _loc_2 = Cache.instance.pack.packRolePackCache.getEquipByType(param1.itemInfo.type);
                if (_loc_2 == null || _loc_2.itemInfo.career != param1.itemInfo.career)
                {
                    return null;
                }
            }
            else if (ItemsUtil.isFashionEquip(param1))
            {
                _loc_3 = FashionUtil.getEquipFashionType(param1);
                _loc_4 = Cache.instance.pack.getFashionPackCacheByCode(_loc_3);
                if (param1.itemInfo.type == EEquipFashionClothes._EEquipFashionClothesShape)
                {
                    _loc_5 = Cache.instance.fashion.getFashionInfo(_loc_3);
                    _loc_6 = _loc_5.advanceInfo ? (_loc_5.advanceInfo.shapeCode) : (0);
                    if (_loc_6 > 100)
                    {
                        _loc_2 = _loc_4.getItemByCode(_loc_6);
                    }
                }
                else
                {
                    _loc_2 = _loc_4.getEquipByType(param1.itemInfo.type);
                }
            }
            else if (ItemsUtil.isMountEquip(param1))
            {
                if (param1.itemInfo.type != EEquipMount._EEquipMountShape)
                {
                    _loc_2 = Cache.instance.pack.mountPackCache.getItemDataByType(param1.itemInfo.type);
                }
                else if (Cache.instance.mount.mountData)
                {
                    _loc_2 = Cache.instance.pack.mountPackCache.getItemByCode(Cache.instance.mount.mountData.sPublicMount.sharpId);
                }
            }
            else if (ItemsUtil.isSpriteEquip(param1))
            {
                _loc_7 = Cache.instance.pack.getWizardPackCacheByCode(int(param1.itemInfo.effectEx));
                if (_loc_7 && _loc_7 is WizardPackCache)
                {
                    _loc_2 = (_loc_7 as WizardPackCache).getEquipByType(param1.itemInfo.type);
                }
            }
            else if (ItemsUtil.isHalidomEquip(param1))
            {
                _loc_2 = Cache.instance.pack.halidomBag.getEquipByType(param1.itemInfo.type);
            }
            else if (ItemsUtil.isPetEquip(param1))
            {
                if (param1.itemInfo.type != EPet2Equip._EPet2EquipShape)
                {
                    _loc_2 = Cache.instance.pack.petBag.getEquipByType(param1.itemInfo.type);
                }
                else if (Cache.instance.mount.mountData)
                {
                    _loc_2 = Cache.instance.pack.petBag.getItemByCode(Cache.instance.newPet.pet.sharpId);
                }
            }
            if (_loc_2 == null || _loc_2.uid == param1.uid)
            {
                return null;
            }
            return _loc_2;
        }// end function

        private function getToolTipByType(param1:String, param2:Dictionary) : IToolTip
        {
            var _loc_4:Class = null;
            var _loc_3:* = param2[param1] as IToolTip;
            if (_loc_3 == null)
            {
                _loc_4 = this._tipsMap[param1] as Class;
                if (_loc_4 == null)
                {
                    Alert.show("TooltipFactory:未注册的ToolTipType:" + param1);
                    return null;
                }
                _loc_3 = new _loc_4 as IToolTip;
                if (!(_loc_3 is IToolTip))
                {
                    Alert.show("TooltipFactory:注册的不是IToolTip， ToolTipType:" + param1);
                    return null;
                }
                param2[param1] = _loc_3;
            }
            return _loc_3;
        }// end function

        private function getFuncPreToolTipType(param1:TSystemTrailer) : String
        {
            if (FuncPreCofonfig.instance.isTextTips(int(param1.system)))
            {
                return TooltipType.Text;
            }
            if (param1.texture != null && param1.mesh != null)
            {
                return TooltipType.FuncPre_3D;
            }
            return TooltipType.FuncPre_Picture;
        }// end function

        private function getItemToolTipType(param1:ItemData) : String
        {
            if (ItemsUtil.isJewel(param1))
            {
                return TooltipType.JewelStone;
            }
            if (ItemsUtil.isSpriteEquip(param1))
            {
                return TooltipType.SpriteEquipment;
            }
            if (ItemsUtil.isEquip(param1))
            {
                if (param1.extDataType == ItemDataExtDataType.Type_XiLianYuLan)
                {
                    return TooltipType.XiLianYuLan;
                }
                return TooltipType.Equipment;
            }
            if (ItemsUtil.isRune(param1.itemInfo))
            {
                return TooltipType.Rune;
            }
            if (ItemsUtil.isPetEgg(param1.itemInfo))
            {
                return TooltipType.PetEgg;
            }
            if (ItemsUtil.isMountEquip(param1) || ItemsUtil.isPetEquip(param1))
            {
                return TooltipType.MountEquip;
            }
            if (ItemsUtil.isTotemEquip(param1))
            {
                return TooltipType.PetTotemEquip;
            }
            if (ItemsUtil.isDefenseEquip(param1))
            {
                return TooltipType.DefenseEquip;
            }
            if (ItemsUtil.isDefenseItemCompose(param1))
            {
                return TooltipType.DefenseComposeItem;
            }
            if (ItemsUtil.isFashionEquip(param1))
            {
                return TooltipType.FashionEquip;
            }
            if (ItemsUtil.isGrowthStuff(param1) || ItemsUtil.isTalentStuff(param1))
            {
                return TooltipType.GrowthTalentItem;
            }
            if (ItemsUtil.isHalidomEquip(param1))
            {
                return TooltipType.HalidomEquip;
            }
            if (ItemsUtil.isMedal(param1))
            {
                return TooltipType.Medal;
            }
            return TooltipType.Item;
        }// end function

    }
}
